package com.zablert.mainactivity.chat

import androidx.annotation.Nullable
import androidx.recyclerview.widget.DiffUtil
import zyc.zalbert.extensions.logd

//传入旧数据和新数据的集合
class ChatDiffCallback(
    private val mOldData: List<ChatParam>?,
    private val mNewData: List<ChatParam>?
) :
    DiffUtil.Callback() {
    override fun getOldListSize(): Int {
        return mOldData?.size ?: 0
    }

    override fun getNewListSize(): Int {
        return mNewData?.size ?: 0
    }

    /**
     * 被DiffUtil调用，用来判断 两个对象是否是相同的Item。
     * 例如，如果你的Item有唯一的id字段，这个方法就 判断id是否相等。
     * 本例判断itemType字段是否一致
     */
    override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        val areTimeTheSame =
            mOldData?.get(oldItemPosition)?.timesId == mNewData?.get(newItemPosition)?.timesId
        val areViewTypeTheSame =
            mOldData?.get(oldItemPosition)?.itemType == mNewData?.get(newItemPosition)?.itemType
//        "areItemsTheSame:$areItemTheSame".logd()
        return areTimeTheSame && areViewTypeTheSame
    }

    /*
     * 被DiffUtil调用，用来检查 两个item是否含有相同的数据
     * 这个方法仅仅在areItemsTheSame()返回true时，才调用。
     * @param oldItemPosition The position of the item in the old list
     * @param newItemPosition The position of the item in the new list which replaces the
     *                        oldItem
     * @return True if the contents of the items are the same or false if they are different.
     */
    override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        val areContentsTheSame =
            mOldData?.get(oldItemPosition)?.msg == mNewData?.get(newItemPosition)?.msg
//        "areContentsTheSame:$areContentsTheSame".logd()
        return areContentsTheSame
    }

    private val payloadResult = Any()

    /**
     * areItemsTheSame()返回true而areContentsTheSame()返回false，也就是说两个对象代表的数据是一条，但是内容更新了。
     * @param oldItemPosition
     * @param newItemPosition
     * @return
     */
    @Nullable
    override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? {
        "mNewData?.get(newItemPosition) = ${mNewData?.get(newItemPosition)}".logd(this)
        return mNewData?.get(newItemPosition)
    }
}